// 构造函数继承    构造函数继承
// function Animal() {
//   this.aa = "111"
//   this.dd = []
// }
// Animal.prototype.Eat = function () {
//   console.log(this.aa, '11111')
//   return 111
// }
// function Cat() {
//   this.bb = "222"
//   Animal.apply(this)
// }
// // Cat.prototype = new Animal()
// let cat = new Cat()
// let cat1 = new Cat()
// console.log(cat.Eat());
// console.log(cat1.dd);



// 原型链继承   缺点如果实例创建了2个,一个数组公用了一个
// function Animal() {
//   this.aa = "111"
//   this.dd = []
// }
// Animal.prototype.Eat = function () {
//   console.log(this.aa, '11111')
//   return 111
// }
// function Cat() {
//   this.bb = "222"
// }
// function Mao() {
//   this.cc = "222"
// }
// Cat.prototype = new Animal()


// let cat = new Cat()
// let cat1 = new Cat()
// console.log(cat.Eat(), 1111);
// console.log(cat.dd);
// cat.dd.push(111)
// console.log(cat1.dd);


// 构造函数和原型链继承

// function Parent3() {
//   this.name = 'parent3';
//   this.play = [1, 2, 3];
//   console.log(1111);
// }
// function Child3() {
//   Parent3.call(this);
//   this.type = 'child3';
// }
// Child3.prototype = new Parent3();
// var s3 = new Child3();
// var s4 = new Child3();
// s3.play.push(4);
// console.log(s3.play, s4.play);

// 构造函数和原型链 优化处理   构造函数被替换成父类了,指向了Parent4
// function Parent4() {
//   this.name = 'parent4';
//   this.play = [1, 2, 3];
// }
// function Child4() {
//   Parent4.call(this);
//   this.type = 'child4';
// }
// Child4.prototype = Parent4.prototype;
// var s3 = new Child4();
// var s4 = new Child4();
// console.log(s3, s4)

// 组合继承 优化2  
function Parent5() {
  this.name = 'parent5';
  this.play = [1, 2, 3];
}
function Child5() {
  Parent5.call(this);
  this.type = 'child5';
}
Child5.prototype = Object.create(Parent5.prototype);
Child5.prototype.constructor = Child5;


// class 其实就是一个函数  

super();
extend
